﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AgileSaude.Entities;
using AgileSaude.Data;
using AgileSaude.Data.Repository;
using FBS.Framework;
using AgileSaude.Business.Validation;

namespace AgileSaude.Business.Process
{
    internal class EspecialidadeProcess
    {
        internal Resultado Incluir(EspecialidadeEntities pObj)
        {
            Resultado resultado = new Resultado();

            try
            {
                resultado.Sucesso = true;

                if (resultado.Sucesso)
                {
                    especialidade obj = new especialidade();
                    Util.CopyPropertyValues(pObj, obj);

                    new especialidadeRepository().Add(obj);
                }
            }
            catch (Exception ex)
            {
                String mensagem = ex.Message;
                new ResultadoProcess().GravarLog(ref resultado, mensagem, "AgileSaude", "", "Incluir", "EspecialidadeProcess");
                resultado.Sucesso = false;
                throw ex;
            }

            return resultado;
        }

        internal Resultado Alterar(EspecialidadeEntities pObj)
        {
            Resultado resultado = new Resultado();
            especialidadeRepository especialidadeRepository = new especialidadeRepository();

            try
            {
                especialidade user = especialidadeRepository.getespecialidade(pObj.idespecialidade);
                Util.CopyPropertyValues(pObj, user);

                especialidadeRepository.Update();
                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                Util.GravarLog(ex.Message, "AgileSaude");
                resultado.Sucesso = false;
                throw ex;
            }

            return resultado;
        }

        internal Resultado Deletar(EspecialidadeEntities pObj)
        {
            Resultado resultado = new Resultado();
            especialidadeRepository EspecialidadeRepository = new especialidadeRepository();

            try
            {
                especialidade obj = EspecialidadeRepository.getespecialidade(pObj.idespecialidade);
                Util.CopyPropertyValues(pObj, obj);

                EspecialidadeRepository.Delete(obj);
                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                Util.GravarLog(ex.Message, "AgileSaude");
                resultado.Sucesso = false;
                throw ex;
            }

            return resultado;
        }

        internal EspecialidadeEntities GetEspecialidade(int pIdEspecialidade)
        {
            especialidade oData = new especialidadeRepository().getespecialidade(pIdEspecialidade);

            if (oData == null)
            {
                return new EspecialidadeEntities();
            }
            else
            {
                return GetEspecialidade(oData);
            }

        }

        internal EspecialidadeEntities GetEspecialidade(string pNome)
        {
            especialidade oData = new especialidadeRepository().getespecialidade(pNome);

            if (oData != null)
            {
                return GetEspecialidade(oData);
            }
            else
            {
                return null;
            }

        }

        private static EspecialidadeEntities GetEspecialidade(especialidade oData)
        {
            EspecialidadeEntities oEntitie = new EspecialidadeEntities();

            Util.CopyPropertyValues(oData, oEntitie);

            return oEntitie;
        }

        internal List<EspecialidadeEntities> Listar(EspecialidadeEntities pFiltro, ref Resultado resultado)
        {
            List<EspecialidadeEntities> lista = new List<EspecialidadeEntities>();

            if (pFiltro == null)
            {
                pFiltro = new EspecialidadeEntities();
            }

            try
            {
                var especialidade = from u in new especialidadeRepository().GetAll()
                             where (string.IsNullOrEmpty(pFiltro.Descricao) || u.Descricao.ToUpper().Contains(pFiltro.Descricao.ToUpper())) &&
                              (pFiltro.idespecialidade == 0 || u.idespecialidade == pFiltro.idespecialidade)
                             select u;

                foreach (especialidade user in especialidade)
                {
                    lista.Add(GetEspecialidade(user));
                }

                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                String mensagem = ex.Message;
                new ResultadoProcess().GravarLog(ref resultado, mensagem, "AgileSaude", "", "Listar", "EspecialidadeProcess");
                resultado.Sucesso = false;
            }

            return lista;
        }
    }
}
